#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@file config_service.py
@brief 配置业务服务类
@details 提供配置管理业务逻辑
@author Motor Controller Team
@date 2024
"""

import logging
from typing import Optional, Callable, Dict, Any

from core.config import ConfigManager, SerialConfig, MotorConfig

logger = logging.getLogger(__name__)


class ConfigService:
    """
    @brief 配置业务服务类
    @details 提供配置管理业务逻辑
    """
    
    def __init__(self, config_manager: ConfigManager):
        """
        @brief 初始化配置服务
        @param config_manager 配置管理器
        """
        self.config_manager = config_manager
        
        # 回调函数
        self.config_changed_callback: Optional[Callable] = None
        
        logger.info("配置服务初始化完成")
    
    def set_config_changed_callback(self, callback: Callable) -> None:
        """
        @brief 设置配置改变回调
        @param callback 回调函数
        """
        self.config_changed_callback = callback
    
    def get_serial_config(self) -> SerialConfig:
        """
        @brief 获取串口配置
        @return SerialConfig 串口配置
        """
        return self.config_manager.get_serial_config()
    
    def set_serial_config(self, config: SerialConfig) -> bool:
        """
        @brief 设置串口配置
        @param config 串口配置
        @return bool 设置是否成功
        """
        try:
            self.config_manager.set_serial_config(config)
            self._notify_config_changed('serial', config)
            logger.info("串口配置已更新")
            return True
        except Exception as e:
            logger.error(f"设置串口配置异常: {e}")
            return False
    
    def get_motor_config(self) -> Optional[MotorConfig]:
        """
        @brief 获取电机配置
        @return Optional[MotorConfig] 电机配置，可能为None
        """
        return self.config_manager.get_motor_config()
    
    def set_motor_config(self, config: MotorConfig) -> bool:
        """
        @brief 设置电机配置
        @param config 电机配置
        @return bool 设置是否成功
        """
        try:
            self.config_manager.set_motor_config(config)
            self._notify_config_changed('motor', config)
            logger.info("电机配置已更新")
            return True
        except Exception as e:
            logger.error(f"设置电机配置异常: {e}")
            return False
    
    
    def save_config(self) -> bool:
        """
        @brief 保存配置到文件
        @return bool 保存是否成功
        """
        try:
            success = self.config_manager.save_config()
            if success:
                logger.info("配置保存成功")
            else:
                logger.error("配置保存失败")
            return success
        except Exception as e:
            logger.error(f"保存配置异常: {e}")
            return False
    
    def load_config(self) -> bool:
        """
        @brief 从文件加载配置
        @return bool 加载是否成功
        """
        try:
            success = self.config_manager.load_config()
            if success:
                logger.info("配置加载成功")
            else:
                logger.info("使用默认配置")
            return success
        except Exception as e:
            logger.error(f"加载配置异常: {e}")
            return False
    
    def reset_to_default(self) -> bool:
        """
        @brief 重置为默认配置
        @return bool 重置是否成功
        """
        try:
            self.config_manager.reset_to_default()
            self._notify_config_changed('all', None)
            logger.info("配置已重置为默认值")
            return True
        except Exception as e:
            logger.error(f"重置配置异常: {e}")
            return False
    
    def validate_config(self) -> Dict[str, Any]:
        """
        @brief 验证配置的有效性
        @return Dict[str, Any] 验证结果
        """
        try:
            return self.config_manager.validate_config()
        except Exception as e:
            logger.error(f"验证配置异常: {e}")
            return {
                'valid': False,
                'errors': [f"验证配置异常: {e}"],
                'warnings': []
            }
    
    def get_available_ports(self) -> list:
        """
        @brief 获取可用的串口列表
        @return list 可用串口列表
        """
        try:
            return self.config_manager.get_available_ports()
        except Exception as e:
            logger.error(f"获取串口列表异常: {e}")
            return []
    
    def get_available_baudrates(self) -> list:
        """
        @brief 获取可用的波特率列表
        @return list 可用波特率列表
        """
        try:
            return self.config_manager.get_available_baudrates()
        except Exception as e:
            logger.error(f"获取波特率列表异常: {e}")
            return []
    
    def get_available_parities(self) -> list:
        """
        @brief 获取可用的校验位列表
        @return list 可用校验位列表
        """
        try:
            return self.config_manager.get_available_parities()
        except Exception as e:
            logger.error(f"获取校验位列表异常: {e}")
            return []
    
    def get_available_system_modes(self) -> list:
        """
        @brief 获取可用的系统模式列表
        @return list 可用系统模式列表
        """
        try:
            return self.config_manager.get_available_system_modes()
        except Exception as e:
            logger.error(f"获取系统模式列表异常: {e}")
            return []
    
    def _notify_config_changed(self, config_type: str, config: Any) -> None:
        """
        @brief 通知配置改变
        @param config_type 配置类型
        @param config 配置对象
        """
        if self.config_changed_callback:
            try:
                self.config_changed_callback(config_type, config)
            except Exception as e:
                logger.error(f"配置改变回调异常: {e}")
